home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Workbench Add-On
/
Workbench Add-On - Volume 1.iso
/
BBS-Archive
/
Comm
/
AmiTCP30b2.lha
/
src
/
appl
/
napsaterm
/
tel_main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-05-14
|
2KB
|
98 lines
/*
* $Id: tel_main.c,v 3.1 1994/05/14 14:17:07 ppessi Exp $
*
* Author: Tomi Ollila <too@cs.hut.fi>
*
* Copyright © 1993, 1994 AmiTCP/IP Group, <amitcp-group@hut.fi>
* Helsinki University of Technology, Finland.
* All rights reserved.
*
* Created: Thu Apr 7 13:29:41 1994 too
* Last modified: Fri May 13 02:42:42 1994 ppessi
*
* HISTORY
* $Log: tel_main.c,v $
* Revision 3.1 1994/05/14 14:17:07 ppessi
* initial revision
*
* Revision 3.1 1994/04/17 11:31:54 too
* initial revision
*
*/
#include "telnet.h"
#include <arpa/telnet.h>
#include "tel_opt.h"
#include "tel_subneg.h"
#include "tel_iacout.h"
long telnetdo(u_char *netbuf, long len)
{
static u_char prevc;
static u_char state = 0;
long netlen, i;
#define touser(c) do { netbuf[netlen++] = c; } while (0)
for (i = 0; i < len; i++) {
u_char c = netbuf[i];
switch (state) {
case 0:
if (c == IAC) {
netlen = i;
state = 2;
}
break;
case 1:
if (c == IAC)
state = 2;
else
touser(c);
break;
case 2:
if (c == IAC) {
touser(IAC);
state = 1;
}
else {
switch (c) {
case SB:
state = 4;
break;
case DO:
case DONT:
case WILL:
case WONT:
prevc = c;
state = 3;
break;
default:
state = 0; /* DATA MARK must be added later */
}
}
break;
case 3: /* WILL, WONT, DO, DONT */
telopt(prevc, c);
state = 1;
break;
case 4: /* Subnegotiation */
if (subneg(c) == TRUE)
state = 1;
break;
}
}
iacflush();
if (state != 0) {
if (state == 1)
state = 0;
return netlen;
}
return len;
}